import axios from 'axios' // 导入 axios
import store from '@/store' // 导入 store
import router from '@/router'
// await 插件用于处理请求成功和失败的结构, 替代 trycatch
import to from 'await-to-js'
import { refreshTokenAPI } from '@/api/user'

// 创建新的 axios 实例
const instance = axios.create({
  baseURL: 'http://geek.itheima.net/'
  // timeout: 5000
})

// 请求拦截器
instance.interceptors.request.use(
  // 处理请求头-请求头携带token
  config => {
    const token = store.state.user.token
    if (token) config.headers.Authorization = `Bearer ${token}`
    return config
  },
  err => Promise.reject(err)
)

// 响应拦截器
instance.interceptors.response.use(
  res => res,
  // 处理token失效401错误
  async err => {
    if (err.response && err.response.status === 401) {
      // 1. 使用 refresh_token 更新token不能使用instance,请求拦截器中会覆盖请求头
      const [err2, res] = await to(
        refreshTokenAPI(store.state.user.refreshToken)
      )
      // 2. 刷新token失败
      if (err2) {
        store.commit('user/setToken', '')
        // 跳转登录页面，需要把在哪个页面失效的页面地址传递给登录页面，登录后回跳
        // encodeURIComponent 用于将字符串进行URL编码 空格会被转换为 "%20"
        // router.currentRoute.fullPath 在VueRouter的方法, 用于获取路由的完整路径
        router.push(
          '/login?returnUrl=' + encodeURIComponent(router.currentRoute.fullPath)
        )
      } else {
        // 3. 刷新token成功
        console.log(res)
        store.commit('user/setToken', res.data.data.token)
        // 4. 继续发送失败请求
        return instance(err.config)
      }
    }
  }
)

// 导出一个新axios实例调用接口的函数，返回值promise
export default ({ url, method = 'GET', params, data, headers }) => {
  return to(instance({ url, method, params, data, headers }))
}
